/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package facade;

import dao.questionnaire.DaoQuestionnaireLocal;
import dao.reponse.DaoAbstractReponseLocal;
import dao.utilisateur.DaoAbstractRepondantLocal;
import dao.utilisateur.DaoRepondantAuthentifieLocal;
import entities.Proposition;
import entities.question.AbstractQuestion;
import entities.questionnaire.Questionnaire;
import entities.reponse.AbstractReponse;
import entities.reponse.ReponseChoix;
import entities.reponse.ReponseLibre;
import entities.utilisateur.AbstractRepondant;
import entities.utilisateur.RepondantAuthentifie;
import java.util.GregorianCalendar;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import services.SrvGestionQuestionnaireLocal;

/**
 *
 * @author aurelien.emery
 */
@Stateless
public class QuestionnaireFacade implements QuestionnaireFacadeLocal {

    @EJB
    private DaoAbstractReponseLocal daoReponse;
    @EJB
    private DaoQuestionnaireLocal daoQuestionnaire;
    @EJB
    private SrvGestionQuestionnaireLocal srvControle;

    @EJB
    private DaoRepondantAuthentifieLocal daoRepondant;



    @Override
    public AbstractReponse addReponseLibre(ReponseLibre reponse, String valeur, Questionnaire questionnaire, AbstractQuestion question) {
        ReponseLibre result = reponse;
        if (result == null) {
            // le repondant est le seul contenu dans la liste de cible du questionnaire (voir methode findQuestionnaire)
            result = new ReponseLibre(question, questionnaire.getListCible().get(0), valeur);
            result.setQuestionnaire(questionnaire);
            // la date de reponse est la date d aujourd hui
            result.setDateReponse(new GregorianCalendar());
            daoReponse.create(result);
        } else {
            result.setReponse(valeur);
            daoReponse.edit(result);
        }

        return result;
    }

    @Override
    public AbstractReponse addReponseChoix(ReponseChoix reponse, List<Proposition> valeur, Questionnaire questionnaire, AbstractQuestion question) {
        ReponseChoix result = reponse;
        if (result == null) { 
            // le repondant est le seul contenu dans la liste de cible du questionnaire (voir methode findQuestionnaire)
            result = new ReponseChoix(question, questionnaire.getListCible().get(0), valeur);
            result.setQuestionnaire(questionnaire);
            // la date de reponse est la date d aujourd hui
            result.setDateReponse(new GregorianCalendar());
            daoReponse.create(result);
        } else {
            result.setListPropositionChoisies(valeur);
            for(Proposition p : reponse.getListPropositionChoisies()){
                System.out.println(p.getTexte());
            }
            daoReponse.edit(result);
        }
        return result;
    }

    @Override
    public Questionnaire findQuestionnaire(String user, String quest, String ctrl) {
        long idQuest;
        long idRep;
        try {
            idQuest = new Long(quest).longValue();
            idRep = new Long(user).longValue();
        } catch (NumberFormatException e) {
            return null;
        }
        // verification de la validité de la chaine de controle
        if (!srvControle.controleCle(idQuest, idRep, ctrl)) {
            return null;
        }

        Questionnaire questionnaire = daoQuestionnaire.find(idQuest);
        if (questionnaire == null) {
            return null;
        }



        // si l id de l utilisateur passé en parametre correspond a un repondant
        // de la liste, on elimine les autres repondant de cette liste
        for (int i = 0; i < questionnaire.getListCible().size(); i++) {
            if (questionnaire.getListCible().get(i).getId() == idRep) {
                RepondantAuthentifie r = questionnaire.getListCible().get(i);
                // on detache le questionnaire pour ne renvoyer celui-ci qu avec
                // l'utilisateur qui passe le questionnaire.
                // Le questionnaire ne necessite pas de modifications
                daoQuestionnaire.detach(questionnaire);
                questionnaire.getListCible().clear();
                questionnaire.getListCible().add(r);

                // on renvoie le questionnaire, détache du contexte de
                // persistence, avec comme seul repondant celui dont l id est
                // en parametre
                return questionnaire;
            }
        }
        // si on arrive ici, c est que l utilisateur ne correspond pas aux
        // repondants du questionnaire
        return null;
    }

    @Override
    public void envoiMail(AbstractRepondant repondant,Questionnaire questionnaire) {
        if (RepondantAuthentifie.class.isAssignableFrom(repondant.getClass())){
            srvControle.remercier(questionnaire, (RepondantAuthentifie)repondant);
        }
    }

    @Override
    public RepondantAuthentifie findRepondant(String login){
        return daoRepondant.findLogin(login);
    }
}
